// 给你单链表的头节点 head ，请你反转链表，并返回反转后的链表。
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
    let res = head;
    let arr = [];
    // 用一个数组保存所有节点
    while (res) {
        let temp = res;
        res = res.next;
        temp.next = null;
        arr.push(temp);
    }
    let headnode = new ListNode(0);
    res = headnode;
    // 倒序输出并连接
    for (let i = arr.length - 1; i >= 0; i--) {
        res.next = arr[i];
        res = res.next;
    }
    return headnode.next;
};
// 迭代法，依此交换next的指向
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
    if (!head || !head.next) return head;
    // 初始化指针
    let pre = null;
    let temp = null;
    // 当前指针指向头节点
    let cur = head;
    // 遍历，每次让两个节点的next指向交换
    while (cur) {
        // 由于要交换，保存当前节点后面的所有节点
        temp = cur.next;
        // 让当前节点指向前一个节点
        cur.next = pre;
        // 迭代，让两个指针向前移动
        pre = cur;
        cur = temp;
    }
    return pre;
};